/*
 * Encog(tm) Core v3.4 - Java Version
 * http://www.heatonresearch.com/encog/
 * https://github.com/encog/encog-java-core
 
 * Copyright 2008-2017 Heaton Research, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *   
 * For more information on Heaton Research copyrights, licenses 
 * and trademarks visit:
 * http://www.heatonresearch.com/copyright
 */
package ml.shifu.shifu.core.dtrain.random;

import org.encog.mathutil.matrices.Matrix;
import org.encog.ml.MLMethod;

/**
 * Defines the interface for a class that is capable of randomizing the weights
 * and bias values of a neural network.
 * 
 * <p>
 * Copied from https://github.com/encog/encog-java-core/.
 * 
 * @author jheaton
 * 
 */
public interface Randomizer {

    /**
     * Randomize the synapses and bias values in the basic network based on an
     * array, modify the array. Previous values may be used, or they may be
     * discarded, depending on the randomizer.
     * 
     * @param network
     *            A network to randomize.
     */
    void randomize(MLMethod network);

    /**
     * Starting with the specified number, randomize it to the degree specified
     * by this randomizer. This could be a totally new random number, or it
     * could be based on the specified number.
     * 
     * @param d
     *            The number to randomize.
     * @return A randomized number.
     */
    double randomize(double d);

    /**
     * Randomize the array based on an array, modify the array. Previous values
     * may be used, or they may be discarded, depending on the randomizer.
     * 
     * @param d
     *            An array to randomize.
     */
    void randomize(double[] d);

    /**
     * Randomize the 2d array based on an array, modify the array. Previous
     * values may be used, or they may be discarded, depending on the
     * randomizer.
     * 
     * @param d
     *            An array to randomize.
     */
    void randomize(double[][] d);

    /**
     * Starting with the specified number, randomize it to the degree specified
     * by this randomizer. This could be a totally new random number, or it
     * could be based on the specified number.
     *
     * @param f The number to randomize.
     * @return A randomized number.
     */
    float randomize(float f);

    /**
     * Randomize the array based on an array, modify the array. Previous values
     * may be used, or they may be discarded, depending on the randomizer.
     *
     * @param f An array to randomize.
     */
    void randomize(float[] f);

    /**
     * Randomize the 2d array based on an array, modify the array. Previous
     * values may be used, or they may be discarded, depending on the
     * randomizer.
     *
     * @param f An array to randomize.
     */
    void randomize(float[][] f);

    /**
     * Randomize an array.
     *
     * @param f     The array to randomize.
     * @param begin The beginning element.
     * @param size  The size of the array.
     */
    void randomize(final float[] f, int begin, int size);

    /**
     * Randomize the matrix based on an array, modify the array. Previous values
     * may be used, or they may be discarded, depending on the randomizer.
     * 
     * @param m
     *            A matrix to randomize.
     */
    void randomize(Matrix m);

    /**
     * Randomize an array.
     * 
     * @param d
     *            The array to randomize.
     * @param begin
     *            The beginning element.
     * @param size
     *            The size of the array.
     */
    void randomize(final double[] d, int begin, int size);

    /**
     * Explicitly set the Random source
     * 
     * @param theRandom
     *            Random number generator.
     */
    void setRandom(GenerateRandom theRandom);

    /**
     * @return Retrieve the Random generator.
     */
    GenerateRandom getRandom();
}